package com.zds.zds_picture_backend.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zds.zds_picture_backend.model.dto.space.SpaceAddRequest;
import com.zds.zds_picture_backend.model.dto.space.SpaceQueryRequest;
import com.zds.zds_picture_backend.model.entity.Space;
import com.zds.zds_picture_backend.model.entity.User;
import com.zds.zds_picture_backend.model.vo.SpaceVO;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 33882
 * @description 针对表【space(空间)】的数据库操作Service
 * @createDate 2025-10-12 20:49:43
 */
public interface SpaceService extends IService<Space> {

    /**
     * 验证空间的有效性，并根据参数决定是否添加空间
     *
     * @param space 需要验证的空间对象
     * @param add   是否添加空间的标志位，true表示需要添加，false表示不需要添加
     */
    void validSpace(Space space, boolean add);

    /**
     * 根据空间查询请求参数构建查询条件包装器
     *
     * @param paceQueryRequest 空间查询请求对象，包含查询条件参数
     * @return QueryWrapper<Space> 返回一个包含查询条件的QueryWrapper对象，用于数据库查询操作
 */
    QueryWrapper<Space> getQueryWrapper(SpaceQueryRequest paceQueryRequest);

    /**
     * 获取空间视图对象(SpaceVO)的分页列表
     * 该方法将空间实体对象(Space)的分页结果转换为视图对象(SpaceVO)的分页结果
     *
     * @param pacePage 空间实体对象(Space)的分页信息，包含分页参数和空间实体列表
     * @param request HTTP请求对象，可用于获取请求相关的信息，如用户信息等
     * @return 返回空间视图对象(SpaceVO)的分页列表，包含转换后的视图对象和分页信息
 */
    Page<SpaceVO> getSpaceVOPage(Page<Space> pacePage, HttpServletRequest request);

    SpaceVO getSpaceVO(Space pace, HttpServletRequest request);

    /**
     * 根据空间级别填充空间
     * 该方法用于根据传入的空间参数，按照特定的空间级别规则进行填充操作
     *
     * @param space 需要填充的空间对象，包含空间的相关信息和属性
 */
    void fillSpaceBySpaceLevel(Space space);

    /**
     * 添加空间的方法
     * @param spaceAddRequest 包含空间添加信息的请求对象
     * @param loginuser 当前登录用户信息
     * @return 返回操作结果，使用long类型表示
 */
    long addSpace(SpaceAddRequest spaceAddRequest, User loginuser);

    /**
     * 检查用户在空间中的权限
     * @param loginuser 登录用户对象，包含用户信息和权限数据
     * @param space 空间对象，包含空间信息和访问规则
 */
    void checkSpaceAuth(User loginuser, Space space);

}
